// // Functor 函子
// class Container {
//   constructor (value) {
//     this._value = value
//   }
//   map (fn) {
//     return new Container(fn(this._value))
//   }
// }

// let r = new Container(5)
//   .map(x => x + 1)
//   .map(x => x * x)

//   console.log(r)

// class Container {
//   static of (value) {
//     return new Container(value)
//   }
//   constructor (value) {
//     this._value = value
//   }
//   map (fn) {
//     return Container.of(fn(this._value))
//   }
// }

// let r = Container.in(5)
//   .map(x => x + 1)
//   .map(x => x * x)

//   console.log(r)

// Container.of(null)
//   .map(x => x.toUpperCase())

// MayBe函子

// class MayBe {
//   static of (value) {
//     return new MayBe(value)
//   }
//   constructor (value) {
//     this._value = value
//   }
//   map (fn) {
//     return this.isNoting() ? MayBe.of(null) : MayBe.of(fn(this._value))
//   }
//   isNoting () {
//     return this._value === null || this._value === undefined
//   }
// }

// // let r = MayBe.of('Hello World')
// //   .map(x => x.toUpperCase())
// // let r = MayBe.of()
// //   .map(x => x.toUpperCase())
// let r = MayBe.of('Hello World')
//   .map(x => x.toUpperCase())
//   .map(x => null)
//   .map(x => x.split(','))

//   console.log(r)


class Left {
  static of (value) {
    return new Left(value)
  }
  constructor (value) {
    this._value = value
  }
  map (fn) {
    return this
  }
}

class Right {
  static of (value) {
    return new Right(value)
  }
  constructor (value) {
    this._value = value
  }
  map (fn) {
    return Right.of(fn(this._value))
  }
}

// let r1 = Right.of(12).map(x => x + 2)
// let r2 = Left.of(12).map(x => x + 2)
// console.log(r1)
// console.log(r2)

function parseJSON (str) {
  try {
    return Right.of(JSON.parse(str))
  } catch (error) {
    return Left.of({ error: error.message})
  }
}
let r = parseJSON('{"name": "xsxs"}').map(x => x.name.toUpperCase())
console.log(r)